package com.study.spmongodb.book.wwj.char23;

/**
 * @author MI
 * @version 1.0
 * @date 2020/11/30 20:46
 */
public abstract class Latch {
    /**
     * 用于控制多少个线程完成任务时才能打开阀门
     */
    protected int limit;

    public Latch(int limit) {
        this.limit = limit;
    }

    /**
     * 该方法会使得当前线程一致等待，直到所有的线程都完成工作，被阻塞的线程是被允许中断
     *
     * @throws InterruptedException
     */
    public abstract void await() throws InterruptedException;

    /**
     * 当前任务线程完成之后调用该方法使得计数器减一
     */
    public abstract void countDown() throws IllegalAccessException;

    /**
     * 获取当前还有多少个线程没有完成任务
     *
     * @return
     */
    public abstract int getUnarrived();
}
